package dbx

import (
	"database/sql"
	"log"
	"sync"
	"time"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

var (
	gormDb *gorm.DB
	once   sync.Once
)

func GetDb(dsn string, debug bool) *gorm.DB {
	once.Do(func() {
		gormDb = newMysql(dsn, debug)
	})
	return gormDb
}

func newMysql(dsn string, debug bool) *gorm.DB {
	db, err := sql.Open("mysql", dsn)
	if err != nil {
		log.Panicf("mysql open error: %s", err)
	}
	// SetMaxIdleConns 设置空闲连接池中连接的最大数量
	db.SetMaxIdleConns(10)

	// SetMaxOpenConns 设置打开数据库连接的最大数量。
	db.SetMaxOpenConns(100)

	// SetConnMaxLifetime 设置了连接可复用的最大时间。
	db.SetConnMaxLifetime(time.Hour)

	gdb, err := gorm.Open(mysql.New(mysql.Config{
		Conn: db,
	}), &gorm.Config{})
	if err != nil {
		log.Panicf("mysql open error: %s", err)
	}
	gdb.Set("gorm:table_options", "CHARSET=utf8mb4")
	if debug {
		_ = gdb.Use(&TracePlugin{})
	}

	return gdb
}
